home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Progress Indicators / LAGAIndetermProgress.cp < prev    next >
Text File  |  1996-06-30  |  9KB  |  298 lines

  1. // ===========================================================================
  2. //    LAGAIndetermProgress.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant Indeterminate progress indicator
  5. //    Copyright © 1996 Chrisoft (Christophe ANDRES)  All rights reserved.
  6. //
  7. //    You may use this source code in any application (commercial, shareware, freeware,
  8. //    postcardware, etc), but not remove this notice (no need to acknowledge the use of
  9. //    this class in the about box)
  10. //    You may not sell this source code in any form. This source code may be placed on 
  11. //    publicly accessable archive sites and source code disks. It may not be placed on 
  12. //    profit archive sites and source code disks without the permission of the author, 
  13. //    Christophe ANDRES.
  14. //    
  15. //        This source code is distributed in the hope that it will be useful,
  16. //        but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. //        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. //
  19. //    If you make any change or improvement on this class, please send the improved/changed
  20. //    version to : chrisoft@calva.net or Christophe ANDRES
  21. //                                     20, rue Prosper Mérimée
  22. //                                     67100 STRASBOURG
  23. //                                     FRANCE
  24. //
  25. // ===========================================================================
  26. //    LAGAIndetermProgress.h            <- double-click + Command-D to see class declaration
  27. //
  28. //    LAGAIndetermProgress is my implementation of the “Apple Grayscale Appearance for System 7.5”
  29. //        inderterminate progress indicator. The indicator spins automatically (through LPeridical)
  30. //        but can also be brought to "manual" spin, by calling the Spin method.
  31. //
  32. //        This class requires AGAColors.cp to be present in your project
  33. //
  34. //        Version : 1.2
  35. //
  36. //        Change History (most recent first, date in US form : mm/dd/yy):
  37. //
  38. //                        06/30/96    ca        Public release of version 1.2
  39. //                        06/04/96    ca        added RegisterClass method for easy registry
  40. //                                                        Increased version to 1.2
  41. //                        05/21/96    ca        class made available by Christophe ANDRES <chrisoft@calva.net>
  42. //                                                        (version 1.1)
  43. //
  44. //        To Do:
  45. //
  46.  
  47. #include "LAGAIndetermProgress.h"
  48.  
  49. #include <UEnvironment.h>
  50. #include "AGAColors.h"
  51.  
  52. const short kIndicatorHeight = 14;
  53. const short kMinimumWidth = 16;
  54. const short kImageHeight = 10;
  55. const short kImageWidth = 16;
  56.  
  57. char LAGAIndetermProgress::mPattern[kImageHeight][kImageWidth] =
  58.                                                                     {
  59.                                                                         { 10, 10, 10, 10,  A,  A,  A,  A,  A,  A,  A,  A, 10, 10, 10, 10 },
  60.                                                                         {  8,  8,  8,  8,  8, 10, 10, 10, 10, 10, 10, 10, 10,  8,  8,  8 },
  61.                                                                         {  5,  5,  5,  5,  5,  5,  8,  8,  8,  8,  8,  8,  8,  8,  5,  5 },
  62.                                                                         {  2,  2,  2,  2,  2,  2,  2,  5,  5,  5,  5,  5,  5,  5,  5,  2 },
  63.                                                                         {  W,  W,  W,  W,  W,  W,  W,  W,  3,  3,  3,  3,  3,  3,  3,  3 },
  64.                                                                         {  5,  2,  2,  2,  2,  2,  2,  2,  2,  5,  5,  5,  5,  5,  5,  5 },
  65.                                                                         {  8,  8,  4,  4,  4,  4,  4,  4,  4,  4,  8,  8,  8,  8,  8,  8 },
  66.                                                                         { 10, 10, 10,  6,  6,  6,  6,  6,  6,  6,  6, 10, 10, 10, 10, 10 },
  67.                                                                         {  A,  A,  A,  A,  8,  8,  8,  8,  8,  8,  8,  8,  A,  A,  A,  A },
  68.                                                                         { 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12 }
  69.                                                                     };
  70.  
  71. PixMapHandle LAGAIndetermProgress::mImage = nil;
  72. long LAGAIndetermProgress::mUsage = 0;
  73.  
  74. // static
  75. void LAGAIndetermProgress::Initialise ()
  76.  
  77. {
  78.     Ptr bitsP;
  79.     Int32 n,i,j;
  80.     char color;
  81.     Rect radioSpace;
  82.     PixMapPtr pmp;
  83.     Int32 *scanP;
  84.     
  85.     // Make a PixMapHandle for the image
  86.     bitsP = ::NewPtr(kImageHeight * kImageWidth * 4);
  87.     ThrowIfMemFail_(bitsP);
  88.     mImage = ::NewPixMap();
  89.     ::HLockHi(Handle(mImage));
  90.     pmp = *mImage;
  91.     pmp->baseAddr = bitsP;
  92.     pmp->rowBytes = 0x8000 + kImageWidth * 4;
  93.     pmp->bounds.left = 0;
  94.     pmp->bounds.right = kImageWidth;
  95.     pmp->bounds.top = 0;
  96.     pmp->bounds.bottom = kImageHeight;
  97.     pmp->pmVersion = 0;
  98.     pmp->pixelType = RGBDirect;
  99.     pmp->pixelSize = 32;
  100.     pmp->cmpCount = 3;
  101.     pmp->cmpSize = 8;
  102.     pmp->planeBytes = 0;
  103.     ::DisposeCTable(pmp->pmTable);
  104.     pmp->pmTable = nil;
  105.     pmp->pmReserved = 0;
  106.     
  107.     // Fill it with the pixel array
  108.     scanP = (Int32*)bitsP;
  109.     for (i=0; i < kImageHeight; i++)
  110.             for (j=0; j < kImageWidth; j++)
  111.                 {
  112.                     color = mPattern[i][j];
  113.                     *scanP++ = ((((Int32)gAGAColorArray[color].red)<<8) & 0xFF0000)
  114.                                             +((gAGAColorArray[color].green) & 0xFF00)
  115.                                             +((gAGAColorArray[color].blue>>8) & 0xFF);
  116.                 }
  117. }
  118.  
  119. //    begin <06/04/96    ca>
  120. void LAGAIndetermProgress::RegisterClass ()
  121.  
  122. {
  123.     URegistrar::RegisterClass(LAGAIndetermProgress::class_ID, (ClassCreatorFunc)LAGAIndetermProgress::CreateAGAIndetermProgressStream);
  124. }
  125. //    end <06/04/96    ca>
  126.  
  127. LAGAIndetermProgress* LAGAIndetermProgress::CreateAGAIndetermProgressStream (LStream* inStream)
  128.  
  129. {
  130.     return (new LAGAIndetermProgress(inStream));
  131. }
  132.  
  133. //-------Constructors-------------------------------------------------------------------------------------------------
  134.  
  135. LAGAIndetermProgress::LAGAIndetermProgress (LStream *inStream) : LPane(inStream)
  136.  
  137. {
  138.     mAnimationStep = 0;
  139.     inStream->ReadData(&mAnimationTicks, sizeof(Int32));
  140.         
  141.     if (mFrameSize.height < kIndicatorHeight)
  142.         mFrameSize.height = kIndicatorHeight;
  143.     if (mFrameSize.width < kMinimumWidth)
  144.         mFrameSize.width = kMinimumWidth;
  145.  
  146.     mUsage++;
  147.     if (mImage == nil)
  148.         Initialise();
  149. }
  150.  
  151. LAGAIndetermProgress::LAGAIndetermProgress (const LAGAIndetermProgress &inOriginal) : LPane(inOriginal)
  152.  
  153. {
  154.     mAnimationStep = 0;
  155.     mAnimationTicks = inOriginal.mAnimationTicks;
  156.         
  157.     if (mFrameSize.height < kIndicatorHeight)
  158.         mFrameSize.height = kIndicatorHeight;
  159.     if (mFrameSize.width < kMinimumWidth)
  160.         mFrameSize.width = kMinimumWidth;
  161.  
  162.     mUsage++;
  163.     if (mImage == nil)    //    But since we copy a LAGAIndetermProgress, mImage MUST already be initialized ;)
  164.         Initialise();
  165. }
  166.  
  167. LAGAIndetermProgress::LAGAIndetermProgress (const SPaneInfo &inPaneInfo, Int32 inTicksDelay) : LPane(inPaneInfo)
  168.  
  169. {
  170.     mAnimationStep = 0;
  171.     mAnimationTicks = inTicksDelay;
  172.         
  173.     if (mFrameSize.height < kIndicatorHeight)
  174.         mFrameSize.height = kIndicatorHeight;
  175.     if (mFrameSize.width < kMinimumWidth)
  176.         mFrameSize.width = kMinimumWidth;
  177.  
  178.     mUsage++;
  179.     if (mImage == nil)
  180.         Initialise();
  181. }
  182.  
  183. LAGAIndetermProgress::~LAGAIndetermProgress ()
  184.  
  185. {
  186.     mUsage--;
  187.     if (mUsage)
  188.         {
  189.             if (mImage != nil)
  190.                 {
  191.                     ::DisposePixMap(mImage);
  192.                     mImage = nil;
  193.                 }
  194.         }
  195. }
  196.  
  197. void LAGAIndetermProgress::FinishCreateSelf ()
  198.  
  199. {
  200.     StartIdling();
  201. }
  202.  
  203. //-------Drawers----------------------------------------------------------------------------------------------------
  204.  
  205. void LAGAIndetermProgress::DrawSelf ()
  206.  
  207. {
  208.     StColorPenState theState;
  209.     Boolean hasColor = ::PaneInColor(this);
  210.     Rect frame;
  211.     Rect r;
  212.     StClipRgnState theClip;
  213.     
  214.     theState.Normalize();
  215.     CalcLocalFrameRect(frame);
  216.     frame.bottom = frame.top + kIndicatorHeight;
  217.     if (hasColor)
  218.         {
  219.             ::RGBForeColor(&gAGAColorArray[5]);
  220.             ::MoveTo(frame.left, frame.top + 12);
  221.             ::Line(0, -12);
  222.             ::LineTo(frame.right - 2, frame.top);
  223.             ::ForeColor(whiteColor);
  224.             ::Move(1, 1);        ::Line(0, 12);
  225.             ::LineTo(frame.left + 1, frame.bottom - 1);
  226.         }
  227.     ::ForeColor(blackColor);
  228.     ::InsetRect(&frame, 1, 1);
  229.     ::FrameRect(&frame);
  230.     ::InsetRect(&frame, 1, 1);
  231.     theClip.ClipToIntersection(frame);
  232.     short leftStart = frame.left - (mAnimationStep * 4);
  233.     ::SetRect(&r, leftStart, frame.top, leftStart + kImageWidth, frame.top + kImageHeight);
  234.     if (hasColor)
  235.         {
  236.             GrafPtr thisPort;
  237.             Rect srcRect;
  238.             
  239.             ::GetPort(&thisPort);
  240.             ::SetRect(&srcRect, 0, 0, kImageWidth, kImageHeight);
  241.             do
  242.                 {
  243.                     ::CopyBits((BitMapPtr)*mImage, &thisPort->portBits, &srcRect, &r, srcCopy, nil);
  244.                     r.left += kImageWidth;
  245.                     r.right += kImageWidth;
  246.                 }
  247.             while (r.left < frame.right);
  248.         }
  249.     else
  250.         {
  251.             PolyHandle thePoly = ::OpenPoly();
  252.             ::MoveTo(0, 0);
  253.             ::Line(7, 0);
  254.             ::Line(10, 10);
  255.             ::Line(-7, 0);
  256.             ::Line(-10, -10);
  257.             ::ClosePoly();
  258.             ::OffsetPoly(thePoly, r.left - kImageWidth / 2, r.top);
  259.             do
  260.                 {
  261.                     ::FillPoly(thePoly, &qd.white);
  262.                     ::OffsetPoly(thePoly, kImageWidth / 2, 0);
  263.                     ::FillPoly(thePoly, &qd.black);
  264.                     ::OffsetPoly(thePoly, kImageWidth / 2, 0);
  265.                     r.left += kImageWidth;
  266.                     r.right += kImageWidth;
  267.                 }
  268.             while (r.left < (frame.right + kImageWidth));
  269.             KillPoly(thePoly);
  270.         }
  271.     
  272.     mAnimationStep--;
  273.     if (mAnimationStep < 0)
  274.         mAnimationStep = 3;
  275. }
  276.  
  277. void LAGAIndetermProgress::SpendTime (const EventRecord &inMacEvent)
  278.  
  279. {
  280.     static long time = 0;
  281.     if (::TickCount() > time)
  282.         {
  283.             if (FocusDraw())
  284.                 {
  285.                     Spin();
  286.                     time = TickCount() + mAnimationTicks;
  287.                 }
  288.         }
  289. }
  290.  
  291. void LAGAIndetermProgress::Spin ()
  292.  
  293. {
  294.     if (FocusDraw())
  295.         DrawSelf();
  296. }
  297.  
  298.